这道题其实可以用纯模拟来做,把字符串看做一个算式,‘FD’相当于加,‘BK’相当于减,‘REPEAT’相当于乘,‘【】’相当于()。
详细解释见代码注释。。。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
using namespace std;
char a[260];//字符串 
int b[]={0,1,10,100,1000,10000,100000,1000000,10000000,100000000,1000000000};//用来处理字符串中的位数关系,一直到十亿 
int num[7878]={1};//用来记录REPEAT(相当于乘)当前的数 
int lena,now,pd,numn,len_num;//lena=字符串长度  now=当前距起点的距离  pd=1时表示前进,pd=2时表示后退,pd=3时表示REPEAT
//numn表示num数组当前下标  len_num用来为num数组加数 
int main()//主程序(程序快乐的开始了) 
{
	gets(a);//输入  注:gets 一直读到回车('\n')  scanf读到空格(' ') 所以要用gets 
	lena=strlen(a);//记录长度 
	for(int i=0;i<lena;)//处理 
	{
		while(a[i]==' ')//空格跳过 
			i++;
		if(i>=lena)  break;//判断是否到头 
		if(a[i]=='[')//当出现‘【’时说明有REPEAT 以便乘num数组 
		{
			numn++;
			i++;
			continue;
		}
		if(a[i]==']')//当出现‘】’时说明REPEAT结束 乘之前的num数组 
		{
			numn--;
			i++;
			continue;
		}
		if(a[i]=='R'&&a[i+1]=='E')//处理REPEAT 
		{
			pd=3;//防止处理前进或后退 
			i+=6;//往前处理 
			while(a[i]==' ')//跳过空格 
				i++;
			int ii=0,iii=i;//处理数字 
			while(a[iii]>='0'&&a[iii]<='9')//符合数字范围 
			{
				ii++;//用来记数的位数 
				iii++;//用来往前处理数字 
			}
			int x=0;//数的总和 
			while(ii)//计算数的总和 
			{
				x=int(a[i]-'0')*b[ii]+x;//当前数*位数+原来的数 
				ii--;//位数-1 
				i++;//往前处理 
			}
			x*=num[numn];//乘之前的REPEAT 
			num[++len_num]=x;//加入新的乘数(REPEAT) 
		}
		if(a[i]=='F'&&a[i+1]=='D')//处理前进 
		{
			i+=2;//往前处理 
			pd=1;//用来表示前进 
			continue;
		}
		if(a[i]=='B'&&a[i+1]=='K')//处理后退 
		{
			i+=2;//同上 
			pd=2;//用来表示后退 
			continue;
		}
		if(pd!=3)//处理前进或后退而不处理REPEAT 
		{
			int ii=0,iii=i;//同上 
			while(a[iii]>='0'&&a[iii]<='9')
			{
				ii++;
				iii++;
			}
			int x=0;
			while(ii)
			{
				x=int(a[i]-'0')*b[ii]+x;
				ii--;
				i++;
			}
			x*=num[numn];
			if(pd==1)  now+=x;//如果前进 + 
			else  if(pd==2)  now-=x;//如果后退 - 
		}
		pd=0;//pd归零 
	}
	if(now<0)  now=0-now;//处理负数(求绝对值,可用abs(cmath)) 
	printf("%d",now);//输出 
	return 0;//程序快乐的结束了 
}